package WordCount;

import java.util.*;
import java.util.Map.Entry;

public class Word {
//	
	String str;//文件中的内容
	private int charNum;//字符个数 
	private int wordNum;//单词个数
	private int lineNum;//有效行数
	private Map<String,Integer> wordFreq;//单词频数
	
	public Word(String string)
	{
		this.str = string;
	}
	
	//统计文件的字符数：只需要统计Ascii码，汉字不需考虑空格，水平制表符，换行符，均算字符
	public int getcharNum()
	{
		char ch;
		for(int i = 0;i<str.length();i++)
		{
			ch = str.charAt(i);//String str = "abc";char ch = str.charAt(0);char ch2 = str.charAt(1);这时候ch是a，ch2是b；
			if(ch>=32 && ch<=126 || ch == '\n' || ch == '\r' || ch == '\t') //换行（'\n'）、回车（'\r'）、水平制表符（'\t'）、垂直制表符（'\v'）
			{
				charNum++;
			}
		}
		return charNum;
	}
	
	//统计文件的单词总数，单词：以4个英文字母开头，跟上字母数字符号，单词以分隔符分割，不区分大小写。
	public int getwordNum()//file123是一个单词，1file不是一个单词。file，File和FILE是同一个单词
	{
		String s = str;
		
		s = s.replace('\n',' ');
		s = s.replace('\r',' ');
		s = s.replace('\t',' ');
		
		String[] everyword = s.split(" +");//用空格作为分割
		
	
		for(int i = 0;i<everyword.length;i++)
		{
			
			if(everyword[i].length()<4)
			{
				continue;
			}
			else //符合长度的单词
			{
				int flag=0;
				char[] ch = everyword[i].toCharArray();//每一个everyword数组内容拆分成字符数组
				for(int j = 0;j<4;j++)
				{
					if(!(ch[j]>= 'A' && ch[j]<= 'Z' || ch[j]>= 'a' && ch[j]<= 'z'))
					{
						flag=1;
					}
				}
				if(flag ==0 )
				{
					wordNum++;
				}
			}
		}
		return wordNum;
	}
		
		//统计文件的有效行数：任何包含非空白字符的行，都需要统计。
		public int getlineNum()
		{
			String[] line = str.split("\n|\r");//换行（'\n'）、回车（'\r'）
			for(int i=0; i<line.length;i++)
			{
				if(line[i].trim().isEmpty())
				{
					continue;
				}
				else
				{
					lineNum++;
				}
			}
			return lineNum;
		}
		
		
		
	public List<Map.Entry<String, Integer>> getwordFreq()
	{
		wordFreq = new HashMap<String,Integer>();
		
		String s = str;
		
		s = s.replace('\n',' ');
		s = s.replace('\r',' ');
		s = s.replace('\t',' ');
		
		String[] everyword = s.split(" ");//用空格作为分割
		for(int i = 0;i<everyword.length;i++)
		{
			
			if(everyword[i].length()<4)
			{
				continue;
			}
			else 
			{
				int flag=0;
				char[] ch = everyword[i].toCharArray();
				for(int j = 0;j<4;j++)
				{
					if(!(ch[j]>= 'A' && ch[j]<= 'Z' || ch[j]>= 'a' && ch[j]<= 'z'))//开头四位不全为字母
					{
						flag=1;
					}
				}
				if(flag ==0 )//符合一个单词的标准
				{
					String key = everyword[i].trim().toLowerCase();//统一转换成小写
					if (wordFreq.containsKey(key)){
                        int n=Integer.parseInt(wordFreq.get(key).toString())+1;
                        wordFreq.put(key,n);
                    }else {
                    	wordFreq.put(key,1);
                    }
				}
			}
		}
		
		
		List<Map.Entry<String, Integer>> list = new ArrayList<Map.Entry<String, Integer>>(wordFreq.entrySet());  
        Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {

			@Override//降序排序  
			public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
				// TODO Auto-generated method stub
				if(o1.getValue() == o2.getValue())
				{
					return o1.getKey().compareTo(o2.getKey());
				}
				return o2.getValue().compareTo(o1.getValue()); 
			}  
        });  
        return list;
       /* for (Entry<String, Integer> mapping : list) {  //输出
            System.out.println(mapping.getKey() + ":" + mapping.getValue());  
        }  */
	}
		
		
	}
	
	
